#ifndef _WX_INTL_H_
#define _WX_INTL_H_

#include "wx/defs.h"
#include "wx/string.h"

enum wxLayoutDirection {
  wxLayout_Default,
  wxLayout_LeftToRight,
  wxLayout_RightToLeft
};

#if wxUSE_INTL

#include "wx/fontenc.h"

#ifndef WXINTL_NO_GETTEXT_MACRO
#define _(s)   wxGetTranslation(wxT(s))
#define wxPLURAL(sing, plur, n)  wxGetTranslation(wxT(sing), wxT(plur), n)
#endif



#define wxTRANSLATE(str) wxT(str)

class wxLocale;
class wxLanguageInfoArray;
class wxMsgCatalog;

enum wxLanguage {

  wxLANGUAGE_DEFAULT,

  wxLANGUAGE_UNKNOWN,

  wxLANGUAGE_ABKHAZIAN,
  wxLANGUAGE_AFAR,
  wxLANGUAGE_AFRIKAANS,
  wxLANGUAGE_ALBANIAN,
  wxLANGUAGE_AMHARIC,
  wxLANGUAGE_ARABIC,
  wxLANGUAGE_ARABIC_ALGERIA,
  wxLANGUAGE_ARABIC_BAHRAIN,
  wxLANGUAGE_ARABIC_EGYPT,
  wxLANGUAGE_ARABIC_IRAQ,
  wxLANGUAGE_ARABIC_JORDAN,
  wxLANGUAGE_ARABIC_KUWAIT,
  wxLANGUAGE_ARABIC_LEBANON,
  wxLANGUAGE_ARABIC_LIBYA,
  wxLANGUAGE_ARABIC_MOROCCO,
  wxLANGUAGE_ARABIC_OMAN,
  wxLANGUAGE_ARABIC_QATAR,
  wxLANGUAGE_ARABIC_SAUDI_ARABIA,
  wxLANGUAGE_ARABIC_SUDAN,
  wxLANGUAGE_ARABIC_SYRIA,
  wxLANGUAGE_ARABIC_TUNISIA,
  wxLANGUAGE_ARABIC_UAE,
  wxLANGUAGE_ARABIC_YEMEN,
  wxLANGUAGE_ARMENIAN,
  wxLANGUAGE_ASSAMESE,
  wxLANGUAGE_AYMARA,
  wxLANGUAGE_AZERI,
  wxLANGUAGE_AZERI_CYRILLIC,
  wxLANGUAGE_AZERI_LATIN,
  wxLANGUAGE_BASHKIR,
  wxLANGUAGE_BASQUE,
  wxLANGUAGE_BELARUSIAN,
  wxLANGUAGE_BENGALI,
  wxLANGUAGE_BHUTANI,
  wxLANGUAGE_BIHARI,
  wxLANGUAGE_BISLAMA,
  wxLANGUAGE_BRETON,
  wxLANGUAGE_BULGARIAN,
  wxLANGUAGE_BURMESE,
  wxLANGUAGE_CAMBODIAN,
  wxLANGUAGE_CATALAN,
  wxLANGUAGE_CHINESE,
  wxLANGUAGE_CHINESE_SIMPLIFIED,
  wxLANGUAGE_CHINESE_TRADITIONAL,
  wxLANGUAGE_CHINESE_HONGKONG,
  wxLANGUAGE_CHINESE_MACAU,
  wxLANGUAGE_CHINESE_SINGAPORE,
  wxLANGUAGE_CHINESE_TAIWAN,
  wxLANGUAGE_CORSICAN,
  wxLANGUAGE_CROATIAN,
  wxLANGUAGE_CZECH,
  wxLANGUAGE_DANISH,
  wxLANGUAGE_DUTCH,
  wxLANGUAGE_DUTCH_BELGIAN,
  wxLANGUAGE_ENGLISH,
  wxLANGUAGE_ENGLISH_UK,
  wxLANGUAGE_ENGLISH_US,
  wxLANGUAGE_ENGLISH_AUSTRALIA,
  wxLANGUAGE_ENGLISH_BELIZE,
  wxLANGUAGE_ENGLISH_BOTSWANA,
  wxLANGUAGE_ENGLISH_CANADA,
  wxLANGUAGE_ENGLISH_CARIBBEAN,
  wxLANGUAGE_ENGLISH_DENMARK,
  wxLANGUAGE_ENGLISH_EIRE,
  wxLANGUAGE_ENGLISH_JAMAICA,
  wxLANGUAGE_ENGLISH_NEW_ZEALAND,
  wxLANGUAGE_ENGLISH_PHILIPPINES,
  wxLANGUAGE_ENGLISH_SOUTH_AFRICA,
  wxLANGUAGE_ENGLISH_TRINIDAD,
  wxLANGUAGE_ENGLISH_ZIMBABWE,
  wxLANGUAGE_ESPERANTO,
  wxLANGUAGE_ESTONIAN,
  wxLANGUAGE_FAEROESE,
  wxLANGUAGE_FARSI,
  wxLANGUAGE_FIJI,
  wxLANGUAGE_FINNISH,
  wxLANGUAGE_FRENCH,
  wxLANGUAGE_FRENCH_BELGIAN,
  wxLANGUAGE_FRENCH_CANADIAN,
  wxLANGUAGE_FRENCH_LUXEMBOURG,
  wxLANGUAGE_FRENCH_MONACO,
  wxLANGUAGE_FRENCH_SWISS,
  wxLANGUAGE_FRISIAN,
  wxLANGUAGE_GALICIAN,
  wxLANGUAGE_GEORGIAN,
  wxLANGUAGE_GERMAN,
  wxLANGUAGE_GERMAN_AUSTRIAN,
  wxLANGUAGE_GERMAN_BELGIUM,
  wxLANGUAGE_GERMAN_LIECHTENSTEIN,
  wxLANGUAGE_GERMAN_LUXEMBOURG,
  wxLANGUAGE_GERMAN_SWISS,
  wxLANGUAGE_GREEK,
  wxLANGUAGE_GREENLANDIC,
  wxLANGUAGE_GUARANI,
  wxLANGUAGE_GUJARATI,
  wxLANGUAGE_HAUSA,
  wxLANGUAGE_HEBREW,
  wxLANGUAGE_HINDI,
  wxLANGUAGE_HUNGARIAN,
  wxLANGUAGE_ICELANDIC,
  wxLANGUAGE_INDONESIAN,
  wxLANGUAGE_INTERLINGUA,
  wxLANGUAGE_INTERLINGUE,
  wxLANGUAGE_INUKTITUT,
  wxLANGUAGE_INUPIAK,
  wxLANGUAGE_IRISH,
  wxLANGUAGE_ITALIAN,
  wxLANGUAGE_ITALIAN_SWISS,
  wxLANGUAGE_JAPANESE,
  wxLANGUAGE_JAVANESE,
  wxLANGUAGE_KANNADA,
  wxLANGUAGE_KASHMIRI,
  wxLANGUAGE_KASHMIRI_INDIA,
  wxLANGUAGE_KAZAKH,
  wxLANGUAGE_KERNEWEK,
  wxLANGUAGE_KINYARWANDA,
  wxLANGUAGE_KIRGHIZ,
  wxLANGUAGE_KIRUNDI,
  wxLANGUAGE_KONKANI,
  wxLANGUAGE_KOREAN,
  wxLANGUAGE_KURDISH,
  wxLANGUAGE_LAOTHIAN,
  wxLANGUAGE_LATIN,
  wxLANGUAGE_LATVIAN,
  wxLANGUAGE_LINGALA,
  wxLANGUAGE_LITHUANIAN,
  wxLANGUAGE_MACEDONIAN,
  wxLANGUAGE_MALAGASY,
  wxLANGUAGE_MALAY,
  wxLANGUAGE_MALAYALAM,
  wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM,
  wxLANGUAGE_MALAY_MALAYSIA,
  wxLANGUAGE_MALTESE,
  wxLANGUAGE_MANIPURI,
  wxLANGUAGE_MAORI,
  wxLANGUAGE_MARATHI,
  wxLANGUAGE_MOLDAVIAN,
  wxLANGUAGE_MONGOLIAN,
  wxLANGUAGE_NAURU,
  wxLANGUAGE_NEPALI,
  wxLANGUAGE_NEPALI_INDIA,
  wxLANGUAGE_NORWEGIAN_BOKMAL,
  wxLANGUAGE_NORWEGIAN_NYNORSK,
  wxLANGUAGE_OCCITAN,
  wxLANGUAGE_ORIYA,
  wxLANGUAGE_OROMO,
  wxLANGUAGE_PASHTO,
  wxLANGUAGE_POLISH,
  wxLANGUAGE_PORTUGUESE,
  wxLANGUAGE_PORTUGUESE_BRAZILIAN,
  wxLANGUAGE_PUNJABI,
  wxLANGUAGE_QUECHUA,
  wxLANGUAGE_RHAETO_ROMANCE,
  wxLANGUAGE_ROMANIAN,
  wxLANGUAGE_RUSSIAN,
  wxLANGUAGE_RUSSIAN_UKRAINE,
  wxLANGUAGE_SAMOAN,
  wxLANGUAGE_SANGHO,
  wxLANGUAGE_SANSKRIT,
  wxLANGUAGE_SCOTS_GAELIC,
  wxLANGUAGE_SERBIAN,
  wxLANGUAGE_SERBIAN_CYRILLIC,
  wxLANGUAGE_SERBIAN_LATIN,
  wxLANGUAGE_SERBO_CROATIAN,
  wxLANGUAGE_SESOTHO,
  wxLANGUAGE_SETSWANA,
  wxLANGUAGE_SHONA,
  wxLANGUAGE_SINDHI,
  wxLANGUAGE_SINHALESE,
  wxLANGUAGE_SISWATI,
  wxLANGUAGE_SLOVAK,
  wxLANGUAGE_SLOVENIAN,
  wxLANGUAGE_SOMALI,
  wxLANGUAGE_SPANISH,
  wxLANGUAGE_SPANISH_ARGENTINA,
  wxLANGUAGE_SPANISH_BOLIVIA,
  wxLANGUAGE_SPANISH_CHILE,
  wxLANGUAGE_SPANISH_COLOMBIA,
  wxLANGUAGE_SPANISH_COSTA_RICA,
  wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC,
  wxLANGUAGE_SPANISH_ECUADOR,
  wxLANGUAGE_SPANISH_EL_SALVADOR,
  wxLANGUAGE_SPANISH_GUATEMALA,
  wxLANGUAGE_SPANISH_HONDURAS,
  wxLANGUAGE_SPANISH_MEXICAN,
  wxLANGUAGE_SPANISH_MODERN,
  wxLANGUAGE_SPANISH_NICARAGUA,
  wxLANGUAGE_SPANISH_PANAMA,
  wxLANGUAGE_SPANISH_PARAGUAY,
  wxLANGUAGE_SPANISH_PERU,
  wxLANGUAGE_SPANISH_PUERTO_RICO,
  wxLANGUAGE_SPANISH_URUGUAY,
  wxLANGUAGE_SPANISH_US,
  wxLANGUAGE_SPANISH_VENEZUELA,
  wxLANGUAGE_SUNDANESE,
  wxLANGUAGE_SWAHILI,
  wxLANGUAGE_SWEDISH,
  wxLANGUAGE_SWEDISH_FINLAND,
  wxLANGUAGE_TAGALOG,
  wxLANGUAGE_TAJIK,
  wxLANGUAGE_TAMIL,
  wxLANGUAGE_TATAR,
  wxLANGUAGE_TELUGU,
  wxLANGUAGE_THAI,
  wxLANGUAGE_TIBETAN,
  wxLANGUAGE_TIGRINYA,
  wxLANGUAGE_TONGA,
  wxLANGUAGE_TSONGA,
  wxLANGUAGE_TURKISH,
  wxLANGUAGE_TURKMEN,
  wxLANGUAGE_TWI,
  wxLANGUAGE_UIGHUR,
  wxLANGUAGE_UKRAINIAN,
  wxLANGUAGE_URDU,
  wxLANGUAGE_URDU_INDIA,
  wxLANGUAGE_URDU_PAKISTAN,
  wxLANGUAGE_UZBEK,
  wxLANGUAGE_UZBEK_CYRILLIC,
  wxLANGUAGE_UZBEK_LATIN,
  wxLANGUAGE_VIETNAMESE,
  wxLANGUAGE_VOLAPUK,
  wxLANGUAGE_WELSH,
  wxLANGUAGE_WOLOF,
  wxLANGUAGE_XHOSA,
  wxLANGUAGE_YIDDISH,
  wxLANGUAGE_YORUBA,
  wxLANGUAGE_ZHUANG,
  wxLANGUAGE_ZULU,

  wxLANGUAGE_USER_DEFINED
  , wxLANGUAGE_VALENCIAN = 0x1fffffff,
  wxLANGUAGE_SAMI
};

struct wxLanguageInfo {
  int Language;
  wxString CanonicalName;
  wxString Description;
  wxLayoutDirection LayoutDirection;
};

enum wxLocaleCategory {
  wxLOCALE_CAT_NUMBER,
  wxLOCALE_CAT_DATE,
  wxLOCALE_CAT_MONEY,
  wxLOCALE_CAT_MAX
};

enum wxLocaleInfo {
  wxLOCALE_THOUSANDS_SEP,
  wxLOCALE_DECIMAL_POINT
};

enum wxLocaleInitFlags {
  wxLOCALE_LOAD_DEFAULT  = 0x0001,
  wxLOCALE_CONV_ENCODING = 0x0002
};

class wxLocale {
  public:
    wxLocale() { DoCommonInit(); }
    wxLocale( const wxChar *szName, const wxChar *szShort = ( const wxChar * ) NULL,
              const wxChar *szLocale = ( const wxChar * ) NULL, bool bLoadDefault = true,
              bool bConvertEncoding = false ) {
      DoCommonInit();
      Init( szName, szShort, szLocale, bLoadDefault, bConvertEncoding );
    }

    wxLocale( int language,int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING ) {
      DoCommonInit();
      Init( language, flags );
    }
    bool Init( const wxChar *szName,const wxChar *szShort = ( const wxChar * ) NULL,
               const wxChar *szLocale = ( const wxChar * ) NULL,bool bLoadDefault = true,
               bool bConvertEncoding = false );
    bool Init( int language = wxLANGUAGE_DEFAULT,
               int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING );
    virtual ~wxLocale();
    static int GetSystemLanguage();
    static wxFontEncoding GetSystemEncoding();
    static wxString GetSystemEncodingName();
    static wxString GetInfo( wxLocaleInfo index, wxLocaleCategory cat );
    bool IsOk() const { return m_pszOldLocale != NULL; }


    const wxChar *GetLocale() const { return m_strLocale; }


    int GetLanguage() const { return m_language; }


    wxString GetSysName() const;




    wxString GetCanonicalName() const { return m_strShort; }
    static void AddCatalogLookupPathPrefix( const wxString& prefix );
    bool AddCatalog( const wxChar *szDomain );
    bool AddCatalog( const wxChar *szDomain,
                     wxLanguage msgIdLanguage, const wxChar *msgIdCharset );


    static bool IsAvailable( int lang );


    bool IsLoaded( const wxChar *szDomain ) const;
    static const wxLanguageInfo *GetLanguageInfo( int lang );
    static wxString GetLanguageName( int lang );
    static const wxLanguageInfo *FindLanguageInfo( const wxString& locale );




    static void AddLanguage( const wxLanguageInfo& info );
    virtual const wxChar *GetString( const wxChar *szOrigString,
                                     const wxChar *szDomain = NULL ) const;

    virtual const wxChar *GetString( const wxChar *szOrigString,
                                     const wxChar *szOrigString2,
                                     size_t n,
                                     const wxChar *szDomain = NULL ) const;


    const wxString& GetName() const { return m_strShort; }


    wxString GetHeaderValue( const wxChar* szHeader,
                             const wxChar* szDomain = NULL ) const;




    static void CreateLanguagesDB();
    static void DestroyLanguagesDB();

  private:

    wxMsgCatalog  *FindCatalog( const wxChar *szDomain ) const;



    static void InitLanguagesDB();


    void DoCommonInit();

    wxString       m_strLocale,
                   m_strShort;
    int            m_language;

    const wxChar  *m_pszOldLocale;
    wxLocale      *m_pOldLocale;

    wxMsgCatalog  *m_pMsgCat;

    bool           m_bConvertEncoding;

    bool           m_initialized;

    static wxLanguageInfoArray *ms_languagesDB;

    DECLARE_NO_COPY_CLASS( wxLocale )
};

extern wxLocale* wxGetLocale();


inline const wxChar *
wxGetTranslation( const wxChar *sz, const wxChar* domain = NULL ) {
  wxLocale *pLoc = wxGetLocale();
  if( pLoc ) {
    return pLoc->GetString( sz, domain );
  } else {
    return sz;
  }
}

inline const wxChar *
wxGetTranslation( const wxChar *sz1, const wxChar *sz2,
                  size_t n,
                  const wxChar *domain = NULL ) {
  wxLocale *pLoc = wxGetLocale();
  if( pLoc ) {
    return pLoc->GetString( sz1, sz2, n, domain );
  } else {
    return n == 1 ? sz1 : sz2;
  }
}

#else
#error mm
#if !defined(WXINTL_NO_GETTEXT_MACRO)
#if !defined(_)
#define _(s)                 (wxT(s))
#endif
#define wxPLURAL(sing, plur, n)  ((n) == 1 ? wxT(sing) : wxT(plur))
#endif

#define wxTRANSLATE(str) wxT(str)

inline const wxChar* wxGetTranslation( const wxChar *sz, const wxChar * ( domain ) = NULL ) {
  return sz;
}

#endif

#if !defined(WXINTL_NO_GETTEXT_MACRO)
#if !defined(gettext_noop)
#define gettext_noop(str) wxT(str)
#endif
#if !defined(N_)
#define N_(s)             wxT(s)
#endif
#endif

#endif
